#ifndef _READ_JSON_H_
#define _READ_JSON_H_
#include "dynamic_array.h"
#include "libread_json.h"

#ifndef NULL
    // NULL 的头文件为 stddef.h
    #define NULL ((void *)0)
#endif

// （区别内核版本与应用层版本）
#ifdef KERNEL
/*****************************************************************/
/*                          内核层                                */
/*****************************************************************/
#include <linux/fs.h>
#include <linux/slab.h>  
#include <linux/kernel.h>
typedef struct file* FILE_FD;
#define RJ_FILE_OPEN(name, flags)                  filp_open(name, flags, 0664)
static inline ssize_t RJ_READ_FILE(FILE_FD file_fd, void *out_buf, size_t read_size) {
    loff_t pos = 0;                                 
    return kernel_read(file_fd, out_buf, read_size, &pos);
}
#define RJ_WRITE_FILE(file_fd, in_buf, write_size) vfs_write(file_fd, in_buf, write_size, 0)
#define RJ_FILE_CLOSE(file_fd)                     filp_close(file_fd, 0)
// 日志打印
#define RJ_LOG_DEBUG(fmt, ...)          printk(KERN_DEBUG fmt, ##__VA_ARGS__)
#define RJ_LOG_INFO(fmt, ...)           printk(KERN_INFO fmt, ##__VA_ARGS__)
#define RJ_LOG_WARNING(fmt, ...)        printk(KERN_WARNING fmt, ##__VA_ARGS__)
#define RJ_LOG_ERROR(fmt, ...)          printk(KERN_ERR fmt, ##__VA_ARGS__)
// 内存操作
#define RJ_MALLOC(size)                 kmalloc(size, GFP_KERNEL)
#define RJ_ZALLOC(size)                 kzalloc(size, GFP_KERNEL)   // 申请空间并初始化为0
#define RJ_VMALLOC(size)                vmalloc(size)               // vmalloc - 内核模块申请大片空间时使用
#define RJ_FREE(handle)                 kfree(handle)
#else
/*****************************************************************/
/*                          应用层                                */
/*****************************************************************/
#include <sys/types.h>  // open 头文件
#include <unistd.h>     // read 和 close 头文件
#include <fcntl.h>      // O_RDONLY 头文件
#include <string.h>     // 使用到了memcpy
#include <stdlib.h>     // malloc 与 free
#include <stdarg.h>     // 可变参操作头文件
#include <stdio.h>      // 错误码释义使用了printf
typedef int FILE_FD;
static inline int IS_ERR(FILE_FD fd) {
    return (fd < 0 ? 1 : 0);
}
#define RJ_FILE_OPEN(name, flags)                  open(name, flags)
#define RJ_READ_FILE(file_fd, out_buf, read_size)  read(file_fd, out_buf, read_size)  
#define RJ_WRITE_FILE(file_fd, in_buf, write_size) write(file_fd, in_buf, write_size)
#define RJ_FILE_CLOSE(file_fd)                     close(file_fd)
// 日志打印
#define RJ_LOG_DEBUG(fmt, ...)      printf(fmt, ##__VA_ARGS__)
#define RJ_LOG_INFO(fmt, ...)       printf(fmt, ##__VA_ARGS__)
#define RJ_LOG_WARNING(fmt, ...)    printf(fmt, ##__VA_ARGS__)
#define RJ_LOG_ERROR(fmt, ...)      printf(fmt, ##__VA_ARGS__)
// 内存操作
#define RJ_MALLOC(size)             malloc(size)
// 动态内存分配，并全部初始化为0
static inline void *RJ_ZALLOC(int size)
{
    void *p = malloc(size);
    if (p)
        memset(p, 0, size);
    return p;
}
#define RJ_VMALLOC(size)            malloc(size)
#define RJ_FREE(size)               free(size)
#endif



/*****************  函数声明    *****************/

/**
 *  函数功能:   从json数组中，将每一项json取出来（关键匹配符 [] 或 {} ）
 *  输入参数:
 *          input_buf: 输入json数组字符串
 *                      [{"a":1}, {"b":2}]
 *          input_len: 输入字符串的长度
 *  输出参数:
 *          output_buf: 存放从json数组中取出来的json项的动态数组（一维数组）
 *                      output_buf->mem_start + (0 * output_buf->dimension[0]) == {"a":1}
 *                      output_buf->mem_start + (1 * output_buf->dimension[0]) == {"b":2}
 *  返回值:
 *          成功返回json项数量；
 *          失败返回小于0的错误码；
 */
int cut_json_array_str(dynamic_array_t* output_buf, const char* input_buf, const unsigned int input_len);


int cut_json_str(dynamic_array_t* output_buf, const char* input_json);
int cut_json_member(json_member_t* json_member, const char* input_json_unit);
int get_str_form_x(char* output_buf, int out_buf_len, char* input_buf, char x);
int get_str_form_jsonvalue(char* output_buf, int out_buf_len, const char* input_jsonvalue);


#endif